﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "ElementCreationOptions.h"
#include "IGraphicsText.h"
#include "IVisibilityTypeFlags.h"

namespace gcmp
{
    class IDocument;
    class IGraphicsElementShape;
    class IModelView;

    /// \brief AnnotationTextData 注释文本数据
    ///
    /// 如需要输入多行文字，文字之间通过\n分隔开, 比如“第一行\n第二行”
    struct AnnotationTextData
    {
        std::wstring Text;       ///< 文本文字
        std::wstring FontPath;   ///< 文本文字路径
        Vector3d Position;       ///< 文本文字位置
        Vector3d Direction;      ///< 文本文字方向
        Vector3d Normal;         ///< 文本文字法向
        double CharSize;         ///< 文本文字大小
        Int32 Alignment;         ///< 文字偏移距离
        double WidthFactor;      ///< 文字宽度比例因子
    };

    /// \brief IAnnotationText 注释文本接口
    class GCMP_MODEL_INTERFACE_EXPORT IAnnotationText : public IElement
    {
        DEFINE_CAST_DERIVED(IAnnotationText, IElement);
    public:
        virtual ~IAnnotationText();

#pragma region static fuction
        /// \brief 创建文本文字(IAnnotationText)对象接口方法
        ///
        /// 通过此接口创建文本文字对象
        /// 
        /// \param pDoc   源文档
        /// \param viewID 视图Id
        /// \param textData 文本文字数据
        /// \param eco  Element创建选项, ElementCreationOptions::Normal表示正常，ElementCreationOptions::Transient表示异常
        /// \return IAnnotationText* 文本文字对象指针接口
        static IAnnotationText* Create(IDocument* pDoc, ElementId viewId, const AnnotationTextData& textData,
            ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 创建文本文字(IAnnotationText)对象接口方法
        ///
        /// 通过此接口创建文本文字对象并可以指定相应类别
        /// 
        /// \param pDoc  源文档
        /// \param viewID 视图Id
        /// \param textData 文本文字数据
        /// \param uidCategory  类别属性uid
        /// \return IAnnotationText* 文本文字对象指针接口
        static IAnnotationText* CreateInCustomizedCategory(IDocument* pDoc, ElementId viewID, const AnnotationTextData& textData, const UniIdentity& uidCategory);

        /// \brief 创建多个几何文字(IGraphicsText)方法
        ///
        /// \param pDoc  源文档
        /// \param textData 文本文字数据
        /// \param AnnotationTextStyleId  文字样式Id，默认值为空
        /// \return IAnnotationText GraphicsText对象
        static std::vector<OwnerPtr<IGraphicsText>> CreateGraphicsTexts(IDocument* pDoc, const AnnotationTextData& textData, ElementId AnnotationTextStyleId = ElementId::InvalidID);

#pragma endregion static fuction

#pragma region Grep related
        /// \brief 创建几何表达(IGraphicsElementShape)对象接口方法
        ///
        /// \return OwnerPtr<IGraphicsElementShape> 几何表达对象接口
        virtual OwnerPtr<IGraphicsElementShape> CreateGrep() const = 0;

#pragma endregion Grep related

#pragma region property related
        /// \brief 获得文本图形样式Id
        ///
        /// \return ElementId 文本图形样式Id
        virtual ElementId GetGraphicsStyleId() const = 0;

        /// \brief 设置文本图形样式Id
        ///
        /// \return true 表示成功， false 表示失败
        virtual bool SetGraphicsStyleId(const ElementId& id) = 0;

        /// \brief 获得文本位置坐标
        ///
        /// \return gcmp::Vector3d 位置坐标
        virtual Vector3d GetPosition() const = 0;

        /// \brief 获得是否显示引线
        ///
        /// \return true 显示引线，false 不显示引线
        virtual bool GetShowLead() const = 0;

        /// \brief 获取是否显示边界
        ///
        /// \return true 表示显示, false 表示不显示
        virtual bool GetShowBorder() const = 0;

        // 临时性接口，因GBMP实现剪切板时需要去掉所有的非接口调用而暴露，不确定最终是否暴露
        /// \brief 获取文本所属的视图Id
        /// \return 返回文本所属的视图Id
        virtual const ElementId& GetModelViewId() const = 0;

        // 临时性接口，因GBMP实现剪切板时需要去掉所有的非接口调用而暴露，不确定最终是否暴露
        /// \brief 设置文本所属的视图Id
        /// \param viewId 文本所属的视图Id
        /// \return true-设置成功，false-设置失败
        virtual bool SetModelViewId(const ElementId& modelViewId) = 0;

#pragma endregion property related

        /// \brief 获取可见性标记的非const指针,用户可通过操作此返回值对可见性进行修改
        ///
        /// \return 返回可见性标记的非const指针
        virtual IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() = 0;

        /// \brief 获取可见性标记的const指针
        ///
        /// \return 返回可见性标记的const指针
        virtual const IVisibilityTypeFlags* GetVisibilityTypeFlagsInHostDocument() const = 0;

    public:
        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();

        /// \brief 获取可见性标记
        /// 
        /// \return 标记值
        GCMP_OBSOLETE_API(2020/09/01, IAnnotationText::GetVisibilityTypeFlagsInHostDocument() const) virtual UInt32 GetVisibilityFlag() const = 0;

        /// \brief 设置可见性标记
        /// 
        /// \param flag 标记值
        GCMP_DEPRECATED_API(2020/09/01) virtual bool SetVisibilityFlag(UInt32 flag) = 0;
    };
}



